package br.edu.unipampa.personagem;

import br.edu.unipampa.cenario.Local;
import br.edu.unipampa.recurso.Recurso;
import javax.swing.JOptionPane;

/**
 *
 * @author Anderson Raugust
 */
public class Personagem extends Pessoa {

    public Personagem(int TamanhoBagagem) {
        itens = new Recurso[TamanhoBagagem];
    }

    public String Comer(Local descanso) {
        if (descanso.getRecurso() != null) {
            setForca(getForca() + descanso.getRecurso().getEnergia());
            return "Voce achou alimento (" + descanso.getRecurso().getNome() + ") e comeu!";
        } else {
            return "Não á nenhum alimento para se alimentar";
        }
    }

    public String Dormir(Local descanso) {
        setForca(getForca() + 20);
        return "Você ganhou 20 de força dormindo";
    }

    public String Inventario() {
        String meusItens = "";
        for (int i = 0; i < this.getItens().length; i++) {
            if (this.getItens()[i] != null) {
                meusItens = meusItens + "\n|Codigo Item: " + i + " Item: " + this.getItens()[i].getNome();
            } else {
                meusItens = meusItens + "\n|Item: Espaço vazio no inventario";
            }
        }
        return meusItens;
    }

    public String VerificarClima(Local local) {
        if (local.getNome().equals("Deserto")) {
            return "O céu está cmpletamente limpo, não há sinal de nuvens.\nIsso significa que o tempo estará perfeito para viagem tranquila. Nos próximos Cinco Dias";
        } else {
            if (local.getNome().equals("Charco")) {
                return "O sol está escondido em espessas nuvens, trovões rimbombiam ao longe.\nLogo logo irá cair um torrencial de chuva nos próximos dias ";
            } else {
                return "Daqui a 10 dias choverá";
            }

        }
    }

    public String ProcurarItens(Local local) {
        if (local.getRecurso() == null || !local.getRecurso().Disponivel()) {
            return "O Cenario " + local.getNome() + " não possui nenhum item necessario para sua jornada ou você já possui o item.";
        } else {
            if (local.getRecurso().getNome().equalsIgnoreCase("Agua")) {
                return "Utilize algum item para pegar a agua encontrada no local";
            } else {
                Pegar(local.getRecurso());
                return "++++++ Você achou e pegou o item " + local.getRecurso().getNome() + "+++++++++";
            }
        }
    }

    public void UsarItem(Recurso item) {
        item.setQuantidade(item.getQuantidade() - 1);
        if (item.getQuantidade() <= 0) {
            item = null;
        }
    }

    public String UsarItem(String codigoItem) {
        try {
            return getItens()[Integer.parseInt(codigoItem)].OpcoesItem();
        } catch (NullPointerException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (ArrayIndexOutOfBoundsException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (NumberFormatException erro) {
            return "Digite o codigo de um item valido por favor";
        }
    }

    public String UsarOpcoesItem(String codigoItem, String codigoOpcao, Personagem perso, Local localAtual) {
        try {
            return getItens()[Integer.parseInt(codigoItem)].UtilizaOpcao(Integer.parseInt(codigoOpcao), perso, localAtual);
        } catch (NullPointerException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (ArrayIndexOutOfBoundsException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (NumberFormatException erro) {
            return "Digite o codigo de um item valido por favor";
        }
    }

    public void Pegar(Recurso recurso) {
        for (int i = 0; i < this.getItens().length; i++) {
            if (this.getItens()[i] == null) {
                this.itens[i] = recurso;
                this.itens[i].setQuantidade(1);
                UsarItem(recurso);
                break;
            }
        }
    }

    public Local Seguir(Local localAtual, String escolha) {
        String mensagemUsuario = "Voce escolheu seguir para um local inexistente "
                + "e se perdeu, seguir para o primeiro caminho dado como opção";
        if (localAtual.getProximoCenario() != null) {
            try {
                setForca(getForca() - 10);
                setForca(getForca() - localAtual.getCansaco());
                return localAtual.getProximoCenario()[Integer.parseInt(escolha)];
            } catch (NullPointerException erro) {
                JOptionPane.showMessageDialog(null, mensagemUsuario);
                return localAtual.getProximoCenario()[0];
            } catch (NumberFormatException erro) {
                JOptionPane.showMessageDialog(null, mensagemUsuario);
                return localAtual.getProximoCenario()[0];
            }
        } else {
            return null;
        }
    }

    public Local Voltar(Local localAtual, String escolha) {
        String mensagemUsuario = "Voce escolheu voltar para um local inexistente "
                + "e se perdeu, voltar para o primeiro caminho dado como opção";
        if (localAtual.getCenarioAnterior() != null) {
            try {
                setForca(getForca() - 10);
                setForca(getForca() - localAtual.getCansaco());
                return localAtual.getCenarioAnterior()[Integer.parseInt(escolha)];
            } catch (NullPointerException erro) {
                JOptionPane.showMessageDialog(null, mensagemUsuario);
                return localAtual.getCenarioAnterior()[0];
            } catch (NumberFormatException erro) {
                JOptionPane.showMessageDialog(null, mensagemUsuario);
                return localAtual.getCenarioAnterior()[0];
            }
        } else {
            return null;
        }
    }

    public String VerificaForca() {
        String forca = "Força atual: ";
        for (int i = 0; i < getForca(); i++) {
            forca = forca + "|";
        }
        return forca;
    }
}
